package com.tarena.lbs.common.GlobalExceptionHandle;



import com.tarena.lbs.base.protocol.exception.BusinessException;
import com.tarena.lbs.base.protocol.model.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * ControllerAdvice注解: 标识当前的类为全局异常处理器类型;可以处理由控制器抛出的异常
 *   1.如果Controller中抛出了异常,首先看是否定义了全局异常处理器;
 *   2.如果定义了会在全局异常处理器中找对应的异常处理方法;
 *   3.如果找到了对应的异常处理方法,则执行异常处理方法中的代码逻辑.
 * RestControllerAdvice注解: 复合注解,相当于 @ResponseBody + @ControllerAdvise注解
 */
//@ControllerAdvice
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    /*
      ExceptionHandler注解:表示方法为具体的异常处理方法;需要一个异常处理类型的形式参数;
      1.优先查找该控制器异常对应的异常处理方法;
      2.如果没有对应的异常处理方法,则会找父类的异常处理方法;
      3.如果没有父类的异常处理方法,则会走SpringMVC自己的异常处理机制;
     */

    /**
     * 第1个异常处理方法:IllegalArgumentException
     *
     * @param ex 异常对象
     * @return JsonResult
     */

    //定义处理业务层异常方法
    @ExceptionHandler
    public Result doHandleServiceException(ServiceException ex){
      log.error("业务层异常："+ ex.getPassportResultEnum().getMessage());
      return Result.fail(ex.getPassportResultEnum().getCode(),ex.getPassportResultEnum().getMessage());
    }

    @ExceptionHandler
    public Result<Void> doHandleBusinessException(BusinessException ex) {
        log.error("业务层异常：" + ex.getMessage());
        return new Result<>(ex.getCode(), ex.getMessage(), null);
    }


}
